'use strict';
/**
 * @name VansC2B测试接口 
 * @version 1.0.0
 * @author ljr
 * @Time 2020年12月8日14：10：00
 */
exports.main = async (context) => {
  return 'hello';
};

//存储用户全部的订单信息
exports.getUserOrderInfo = async (ctx) => {
  const { cloud } = ctx;
  try {
    //拉取交易订单信息
    let obj = await getAllOrder(ctx);
    return obj;
    if (obj != 'error') {
      //查询订单表中该用户的订单信息
      let res = await getOrderByOpenid(ctx);
      // 保存过该用户信息的话
      if (res.length != 0) {
        //遍历拿到的全部订单信息
        if (obj.total_results < 100) {
          //遍历订单，用订单id去查表里是否保存了该数据，如果没有就新增该条数据
          const result = await watchObj(ctx,obj);
           return result;
        } else {
          let total = Math.ceil(obj.total_results / 100);
          for (let i = 2; i <= total; i++) {
            //再拉一次订单
            let obj_02 = await getAllOrder(ctx, i);
            //遍历订单，用订单id去查表里是否保存了该数据，如果没有就新增该条数据
            await watchObj(ctx,obj_02);
          }
          return '重新获取订单了,新增插入数据';
        }
      } else {
        //之前没有保存过该订单信息 拉全部的订单信息，仅能拿到近期三个月的订单数据
        //保存订单信息,判断返回的订单总数是不是大于100，如果大于100，则需要拿到每页的数据。
        if (obj.total_results < 100) {
          //插入数据
          // return obj;
         await insertOrder(ctx, obj.trades.trade);
         return "插入成功"
        } else {
          let total = Math.ceil(obj.total_results / 100);
          for (let i = 2; i <= total; i++) {
            //再拉一次订单
            let obj_02 = await getAllOrder(ctx, i);
            //插入数据
            await insertOrder(ctx, obj_02.trades.trade);
          }
          return "插入成功"
        }
      }
    } else {
      return error
    }
  } catch (error) {
    return error
  }
}
//遍历obj,如果不存在则新增
let watchObj = async (ctx,obj)=>{
  let arr = [];
  for(let i=0;i<obj.trades.trade.length;i++){
     const res = await getOrderByTid(ctx,obj.trades.trade[i].tid);
     if(!res.length){
        arr.push(obj.trades.trade[i]);
     }
  }
  if(arr.length){
    await insertOrder(ctx, arr);
    return '新增了数据';
  }else {
    return '没有新增数据!'
  }
  
}

//定时任务函数
//根据订单编号去查询订单信息，定时任务查看是否从预下单变成已下单
//接口需要传递的参数：
//tid
//把抓取回来的那条订单的信息返回，如果订单状态没有改变就不更新，如若改变，更新订单表的交易状态，和订单详情
exports.getUserOrderStatusInfo = async (ctx) => {
  const { cloud } = ctx;
  try {
    // 如何取数据进行更新
    //取5分钟之前的更新数据
    let time = new Date().getTime() - 5 * 60 * 1000;
    //查询订单信息
    let order_info = await getOrderInfoByTime(ctx, time);
    if (order_info) {
      // 限制定时任务的条件 
      let obj = await getOrderStatusByTid(ctx, order_info[0].tid);
      if (obj != 'error') {
        //修改当前订单的状态和时间
         let retobj = await updateOrderInfoByTid(ctx, {tid:order_info[0].tid, state:obj.trade.status});
        return retobj;
      }
    } else {
      return '没有找到数据'
      //没有数据需要修改，结束定时任务
    }
  } catch (error) {
    return JSON.stringify(error)
  }
}

//根据用户的buyer_open_id||buyer_nick  查询用户的订单列表信息包含交易编号
let getAllOrder = async (ctx, page_no = 1) => {
  const { cloud, openId } = ctx;
  try {
    const result = await cloud.topApi.invoke({
      api: 'taobao.open.trades.sold.get',
      autoSession: true,
      data: {
        'fields': 'tid,type,status,payment,orders,rx_audit_status,buyer_nick',
        buyer_open_id: 'AAHRrFnxAJuoLN3qJ7OZn2uA',
        page_no,
        page_size: 100,
      }
    });
    return result;
  } catch (err) {
    return "error"
  }
}

//根据交易编号 tid 去 查询订单状态
let getOrderStatusByTid = async (ctx, tid) => {
  const { cloud } = ctx;
  // return tid
  try {
    const result = await cloud.topApi.invoke({
      api: 'taobao.open.trade.get',
      autoSession: true,
      data: {
        fields: 'tid,type,status,payment,orders,buyer_nick',
        tid,
      }
    });
    return result;
  } catch (err) {
    //必须使用主订单id查询
    return JSON.stringify(err)
  }
}

//根据openid去查询返回的列表
let getOrderByOpenid = async (ctx) => {
  const { cloud, openId } = ctx;
  let data = await cloud.dataspace.executeSql('SELECT * FROM vf_order_info where open_id = ? ', [openId]);
  return data;
}

// 插入订单信息
let insertOrder = async (ctx, trades) => {
  const { cloud } = ctx;
  try {
    let arr = [];
    for (let i = 0; i < trades.length; i++) {
      for (let j = 0; j < trades[i].orders.order.length; j++) {
        arr = [
          trades[i].buyer_open_uid, //'open_id 用于拉取订单',
          "",
          trades[i].tid, //'项目订单id',
          "",
          trades[i].orders.order[j].status, //订单交易状态           
          trades[i].orders.order[j].num_iid, //商品数字id
          trades[i].orders.order[j].sku_id,  //商品的最小库存单位Sku的id.
          JSON.stringify(trades[i].orders.order), //定制详情
        ]
        await cloud.dataspace.executeSql('insert into vf_order_info(open_id,order_id,tid,state,order_state,item_id,sku_id,order_data) values(?,?,?,?,?,?,?,?)', arr);
      }
    }
    // return '插入成功';
  } catch (err) {
    return { success: false, msg: err, }
  }
}

//根据修改时间查询数据

let getOrderInfoByTime = async (ctx, time) => {
  const { cloud } = ctx;
  try {
    let sql = `SELECT * FROM vf_order_info where gmt_modified <= ? and order_state not in('TRADE_FINISHED','TRADE_CLOSED','TRADE_CLOSED_BY_TAOBAO')  ORDER BY gmt_modified LIMIT 1 `
    let data = await cloud.dataspace.executeSql(sql, [curentTime(time)]);
    return data;
  } catch (err) {
    console.log(err);
    return { success: false, msg: err, }
  }
}

// 根据tid 修改表中数据
let updateOrderInfoByTid = async (ctx,obj) => {
  // return JSON.stringify(obj);
  const { cloud } = ctx;
  const {tid,state} = obj;
  let time = curentTime();
  try {
    let data = await cloud.dataspace.executeSql('update vf_order_info set order_state = ? , gmt_modified = ? where tid = ?', [state, time, tid]);
    return data;
  } catch (err) {
    console.log(err);
    return { success: false, msg: err, }
  }
}


//查询当前的订单是否存在
let getOrderByTid = async (ctx,tid)=>{
  const { cloud } = ctx;
  let data = await cloud.dataspace.executeSql('SELECT * FROM vf_order_info where tid = ? ', [tid]);
  return data;
}


var curentTime = function (time) {
  var d = time ? new Date(time) : new Date();
  var localTime = d.getTime();
  var localOffset = d.getTimezoneOffset() * 60000; //获得当地时间偏移的毫秒数
  var utc = localTime + localOffset + 3600000 * 8;
  var now = new Date(utc);

  var year = now.getFullYear(); //年
  var month = now.getMonth() + 1; //月
  var day = now.getDate(); //日
  var hh = now.getHours(); //时
  var mm = now.getMinutes(); //分
  var ss = now.getSeconds(); //秒

  var clock = year + "-";

  if (month < 10)
    clock += "0";

  clock += month + "-";

  if (day < 10)
    clock += "0";

  clock += day + " ";

  if (hh < 10)
    clock += "0";

  clock += hh + ":";

  if (mm < 10)
    clock += "0";

  clock += mm + ":";

  if (ss < 10)
    clock += "0";

  clock += ss;

  return (clock);
}

